/**
 *	@file	pgear_sys.h
 *	@brief	ポケギアシステムヘッダ
 *	@author	Miyuki Iwasawa
 *	@date	07.06.15
 */

#ifndef __H_PGEAR_SYS_H__
#define __H_PGEAR_SYS_H__

#define PGSYS_OAM_RESMAX (4)

#include "system/pms_data.h"
#include "system/cursor_mv.h"
#include "savedata/pgear_sv_util.h"
#include "savedata/config.h"
#include "savedata/mystatus.h"
#include "pgear_snd_def.h"

typedef enum{
	SYSOAM_CLT,
	SYSOAM_CLB,
	SYSOAM_CRT,
	SYSOAM_CRB,
	SYSOAM_DAY,
	SYSOAM_NUM0,
	SYSOAM_NUM1,
	SYSOAM_NUM2,
	SYSOAM_NUM3,
	SYSOAM_NUMCONT,
	SYSOAM_COM,
	SYSOAM_ACTMAX,
}SYSOAM_ID;

typedef enum{
	ANM_SYS_NUM,
	ANM_SYS_NUMCONT,
	ANM_SYS_DAY,
	ANM_SYS_COM,
	ANM_SYS_CLT,
	ANM_SYS_CLB,
	ANM_SYS_CRT,
	ANM_SYS_CRB,
}PGSYS_OAM_ANMID;

///ポジション定義構造体型
typedef struct{
	s16	x;
	s16	y;
}_POSITION;

///ポケギア　システムOAMワーク
typedef struct{
	int	heapID;
	int	cgx_transofs;	///<CGX転送オフセット
	u16	res_max;
	u16	pal_num;
	u16	act_max;
	u16	vramType;

	CLACT_SET_PTR	cas;
	CLACT_U_EASYRENDER_DATA	renddata;	// 簡易レンダーデータ
	CLACT_HEADER_TBL_PTR	clh;		// ヘッダー
	CLACT_U_RES_MANAGER_PTR	resMan[PGSYS_OAM_RESMAX];	///< リソースマネージャ
	CLACT_U_RES_OBJ_TBL * resObjTbl[PGSYS_OAM_RESMAX];///< リソースオブジェテーブル

}PGSYS_OAM_MAN;

///ポケギア　アプリ間で引き渡す保存パラメータ
typedef struct{
	u8	valid;
	u8	affine;	///<アフィン
	u16	word_pos;	//タウンマップ簡易会話ポジション
	u8	l_u,l_d,l_l,l_r;	//リミット
	u16	tx,tz;	//ターゲット位置
	s16	cur_x,cur_y;	///カーソルOBJ位置
	s16 cx,cy;	//スクロールセンター位置
	s16 sx,sy;	//スクロール位置
	u16	zone;	//ターゲットゾーン
	PMS_WORD	word;	///<簡易会話ワード
}PGSYS_RET_PRM_MAP;
typedef struct{
	u8	valid;	//引継ぎパラメータ有効/無効スイッチ
	u8	val[3];	//バッファ

	PGSYS_RET_PRM_MAP	map;
}PGSYS_RET_PARAM;

typedef struct _PGEAR_SYS_WORK PGEAR_SYS_WORK;	///構造体型プロトタイプ
typedef void (*PGEAR_APP_VFUNC)(PGEAR_SYS_WORK* sys_wk,void* app_wk);
typedef void (*PGEAR_KEYVIEW_CHG_FUNC)(void* app_wk);

///ポケギアメインシステムワーク
struct _PGEAR_SYS_WORK{
	int	heapID;

	u8	mode;	///<動作モード
	u8	app_open:7;	///<アプリのオープン状態
	u8	call_end:1;	///<初期呼び出しフラグ
	u8	control;	///<コントロールステート
	u8	rtc_count;	///<RTC更新カウンタ
	u8	skin_id;	///<選択スキンID
	u8	palEvy;		///<パレットフェードカウンタ
	int key_mode;	///<キータッチ操作モード
	int old_key_mode;	///<キータッチ操作モード
	int	main_seq;	///<メインシーケンス
	int	sub_seq;	///<サブシーケンス
	int	next_mode;	///<ポケギア終了フラグ

	PGEAR_PARAM* param;		///<上位ワーク
	SAVEDATA * save;	///<セーブデータ
	PGEAR_SAVE*	pg_save;	///<ポケギアセーブワークへのポインタ
	EVENTWORK * ev_save;	///<イベントデータセーブへのポインタ
	CONFIG * config_save;	///<コンフィグセーブへのポインタ
	MYSTATUS * my_save;		///<MYSTATUSセーブへのポインタ
	PGSYS_RET_PARAM ret;	///<リターンパラメータ
	PGEAR_APP_VFUNC	app_vfunc;	//アプリごとのVBlank処理関数
	PGEAR_KEYVIEW_CHG_FUNC to_akey_func;
	PGEAR_KEYVIEW_CHG_FUNC to_touch_func;
	void*			app_vwork;	//アプリごとのワークをVBlank関数に引き渡すポインタ

	void* frm_work;	///<フレームワーク確保ポインタ
	void* app_work;	///<サブプロセスワーク確保ポインタ
	PROC* proc;	///<サブプロセス確保ポインタ

	GF_BGL_INI *bgl;	///<BGLデータ
	PALETTE_FADE_PTR	palAnm;	///<パレットフェードワーク
	CURSORMV_MANAGER*	curMan;	///<カーソル移動マネージャ
	RTCTime otime;

	CATS_SYS_PTR	pActSys;	///<セルアクターシステム
	CATS_RES_PTR	pActRes;	///<セルアクターリソース
	PGSYS_OAM_MAN*	pSysOam;	///<システムOAMマネージャ

	CATS_ACT_PTR	pSysAct[SYSOAM_ACTMAX];

	void*	pSBufCont;	///<コントローラデータのバッファ
///	void*	pCBufWin;	///<選択ウィンドウのキャラクタバッファ
	NNSG2dScreenData*	pSCont;
//	NNSG2dCharacterData* pCWin;

};

#if 0
///キー動作モード定義
typedef enum{
 PGKM_SYSKEY,
 PGKM_APPKEY,
 PGKM_TOUCH,
};
#endif

typedef enum{
 PGCONT_APP,
 PGCONT_SYS,
};

enum{
 PGKM_SYS_PARAM,
 PGKM_APP_PARAM1,
 PGKM_APP_PARAM2,
 PGKM_APP_PARAM3,
 PGKM_PARAM_MAX,
};

///ポケギアシーケンス定義
typedef enum{
 PGEAR_SEQ_FRAME_INIT,
// PGEAR_SEQ_FRAME_MAIN,
 PGEAR_SEQ_FRAME_END,
 PGEAR_SEQ_SKIN_CALL,
 PGEAR_SEQ_SKIN_WAIT,
 PGEAR_SEQ_RADIO_CALL,
 PGEAR_SEQ_RADIO_WAIT,
 PGEAR_SEQ_MAP_CALL,
 PGEAR_SEQ_MAP_WAIT,
 PGEAR_SEQ_WORD_CALL,
 PGEAR_SEQ_WORD_WAIT,
 PGEAR_SEQ_TEL_CALL,
 PGEAR_SEQ_TEL_WAIT,
 PGEAR_SEQ_END,
}POKEGEAR_SEQ_DEF;

///ポケギアアプリ切替コード
typedef enum{
 PG_NEXT_SKIN,
 PG_NEXT_RADIO,
 PG_NEXT_MAP,
 PG_NEXT_TEL,
 PG_NEXT_EXIT,
 PG_NEXT_JUMP,
 PG_NEXT_WORD,
 PG_NEXT_MARK,
 PG_NEXT_APP_SEQ,
 PG_NEXT_NULL = -1,
}POKEGEAR_NEXT_APP;

///ポケギアアプリ呼び出しモード定義
typedef enum{
 PGAPP_MODE_SKIN = PGMODE_ID_SKIN,
 PGAPP_MODE_RADIO = PGMODE_ID_RADIO,
 PGAPP_MODE_MAP = PGMODE_ID_MAP,
 PGAPP_MODE_TEL = PGMODE_ID_TEL,
 PGAPP_MODE_MAP_MARK = PGMODE_ID_MAX,
}PGEAR_APP_MODE;

///システムパレット占有領域定義
#define PGAPP_PALIDX_M	(0)
#define PGAPP_PALNUM_M	(14)
#define PGSYS_PALIDX_M	(PGAPP_PALNUM_M)
#define PGSYS_PALNUM_M (16-PGAPP_PALNUM_M)

#define PGAPP_PALIDX_S	(0)
#define PGAPP_PALNUM_S	(12)
#define PGSYS_PALIDX_S	(PGAPP_PALNUM_S)
#define PGSYS_PALNUM_S (16-PGAPP_PALNUM_S)

///システムアクターパレット数定義
#define PGSYSOAM_PALIDX_M	(0)
#define PGSYSOAM_PALNUM_M	(4)
#define PGAPPOAM_PALIDX_M	(PGSYSOAM_PALNUM_M)
#define PGAPPOAM_PALNUM_M	(16-PGSYSOAM_PALNUM_M)

#define PGSYSOAM_PALIDX_S	(0)
#define PGSYSOAM_PALNUM_S	(4)
#define PGAPPOAM_PALIDX_S	(PGSYSOAM_PALNUM_S)
#define PGAPPOAM_PALNUM_S	(16-PGSYSOAM_PALNUM_S)

#define PGSYS_OAM_PALMAX (4)

#define MBLOCK_GRID	(32)

///ポケギアシステムリソースアーカイブヘッダ
#include "pgsys_gra.naix"

///ポケギア内グローバル
extern void PokeGearVBlank(void* work);

#endif	//__H_PGEAR_SYS_H__